# -*- coding: utf-8 -*-
import time
import traceback
import win32api
import win32con
import PyHook3
import pythoncom
import configparser
from playsound import playsound
import threading
import win32gui as w
import sys
import os

use = """\
v1.0  /  2022 02 20  by:传说中de李羊羊

使用方法:
    1.启动程序 根据提示切换至游戏界面
    2.按下q键后进行钓鱼的鼠标操作录制,录制成功后按下 空格键 保存
    3.按下a键使用刚刚录制的鼠标操作脚本
注意事项:
    1.同理,可按w键 设置s键脚本 以及e设置d键脚本(q-a,w-s,e-d)最多三组
    2.所有快捷键均为小写,请注意
    3.录制 / 使用 过程中随时可按 空格 终止任务
    4.重复按下asd键,会导致鼠标操作重叠导致钓鱼失败,请避免重复按下
    5.录制时,只会从第一次按下鼠标开始记录,在这之前等待多久都没关系
    6.同理最后一次鼠标抬起之后,在按下空格之前,也不会记录时间
    7.使用脚本,请在看到鱼的时候快速按下asd键最佳
    8.录制脚本,请在鱼已出水的大图状态下按下空格键最佳
    9.软件适配 2.0 / 3.0 版本
    0.配置文件注释:u-即up,鼠标抬起/d-即down,鼠标按下/数字代表持续秒数
"""
QR = """\
##########################################################################
########              ######  ##    ####  ##  ##  ##              ########
########  ##########  ##  ##  ######      ######  ##  ##########  ########
########  ##      ##  ##########  ####  ########  ##  ##      ##  ########
########  ##      ##  ##      ##      ##      ######  ##      ##  ########
########  ##      ##  ####  ########  ##########  ##  ##      ##  ########
########  ##########  ##    ##      ##      ####  ##  ##########  ########
########              ##  ##  ##  ##  ##  ##  ##  ##              ########
##########################      ####    ######    ########################
########          ##        ##  ##  ####  ####  ##  ##  ##  ##  ##########
##########  ####    ##  ####  ##  ######  ####  ##        ######  ########
##########    ######  ######  ########  ####  ##    ##    ################
##########  ####  ####  ########  ##############  ##        ##  ##########
##########  ########          ##    ######      ##########    ############
##########          ##      ########  ##  ####            ######  ########
########  ##  ####    ##    ##    ##      ##  ##        ##    ############
##############  ##  ##########  ##      ####        ##    ####  ##########
########    ##  ####    ##  ##  ##  ##########  ######  ##    ############
########    ################  ##    ##      ##            ##  ##  ########
########  ##  ##  ##  ####    ####        ##  ##    ########  ############
########  ##  ##  ######      ##          ##    ######  ######  ##########
########  ##  ####    ######  ##    ##  ##  ####          ##      ########
########################      ######        ####  ######          ########
########              ##  ##      ####  ####      ##  ##      ############
########  ##########  ####  ##  ########  ##      ######  ####    ########
########  ##      ##  ##  ####    ##############          ##  ############
########  ##      ##  ##    ####    ##        ##  ########        ########
########  ##      ##  ##    ####    ##  ##  ##    ##  ##        ##########
########  ##########  ##    ######  ####  ##  ##  ####      ##  ##########
########              ##  ######        ##########  ##        ############
##########################################################################
"""
about = """\
    说起来做这个半自动脚本起因,是因为本人极度厌烦广告弹窗
    武吧原本的半自动钓鱼工具也是能用的,不过在我电脑上会被误报判毒
    并且按键精灵导出的exe内会带有广告banner
    正好这两天有空,就临时起意用python撸一个出来
    主要也是想顺便挑战一下自己
    别问为啥不做界面,问就是懒
    有任何问题可联系我 不保证回复时效性
    ----致敬徐大 神目 清水 break 伯伯等等前辈  晚辈班门弄斧切莫笑话----
    跪求技术大神指导哇 Orz !
    
                                   By  武林群侠传吧  传说中de李羊羊
                                            2020 02 20 13:02
"""
#音效相关线程
def play():#播放音效 开启线程
    t = threading.Thread(target=playSoundThreading)
    t.start()
def playSoundThreading(): #播放音效 线程内容
    filepath = resource_path(os.path.join("sound", "sound.mp3"))
    playsound(filepath)
def resource_path(relative_path):#生成mp3资源文件目录访问路径
    if getattr(sys, 'frozen', False): #是否Bundle Resource
        base_path = sys._MEIPASS
    else:
        base_path = os.path.abspath("..")
    return os.path.join(base_path, relative_path)

#配置文件相关
def rd(key): #读取脚本
    global cf
    cf.read("钓鱼脚本录制.ini")
    ts = cf.get('btn',key)
    return eval(ts)
def wt(key,ls): #写入脚本
    cf = configparser.ConfigParser()
    cf.read('钓鱼脚本录制.ini')
    cf.set('btn',key,str(ls))
    cf.write(open('钓鱼脚本录制.ini', 'w'))
def addInList(do,tm): #临时脚本存入list
    global ls
    if len(ls)==0:
        ls.append([do])
    else:
        ls.append([do])
        ls[-2].append(tm)

# 鼠标操作相关
def d(tm,fix=0): #模拟按下
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0)
    time.sleep(tm-fix)
def u(tm,fix=0): #模拟鼠标抬起
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0)
    time.sleep(tm-fix)
def MouseLeftUp(event): #鼠标抬起事件
    if w.GetWindowText(w.GetForegroundWindow()) == '猌狶竤獿肚':
        global t0,t1
        t1 = event.Time
        tm = (t1 - t0) / 1000
        if len(ls) != 0:
            print(f' : {tm} 秒')
        addInList('u', tm)
        print("鼠标抬起",end='')#, event.MessageName)  # 事件名称
        return True
    return True
def MouseLeftDown(event): #鼠标按下事件
    if w.GetWindowText(w.GetForegroundWindow()) == '猌狶竤獿肚':
        global t1,t0
        t0 = event.Time
        tm = (t0 - t1) / 1000
        if len(ls)!=0:
            print(f' : {tm} s')
        addInList('d', tm)
        print("鼠标按下",end='')#, event.MessageName)  # 事件名称
        return True
    return True
# 按键操作相关
def pressSpace():
    global ls,writeBtn,r
    r += 1
    play()
    print('\n空格-停止')
    hm.UnhookMouse()  # 取消鼠标钩子
    if r == 1:
        if len(ls) != 0:
            ls[-1].append(0.1)
        for i in ls:
            print(i)
        wt(writeBtn, ls)
        ls = []
        writeBtn = '0'
def pressQWE(a): #按下脚本 录制 快捷键
    global ls,writeBtn,r
    play()
    writeBtn = a  # 97
    print(f'录制脚本{a}')  # 普通鱼
    hm.UnhookMouse()  # 取消鼠标钩子
    hm.MouseLeftUp = MouseLeftUp  # 将OnMouseEvent函数绑定到MouseAllButtonsDown事件上
    hm.MouseLeftDown = MouseLeftDown
    hm.HookMouse()  # 设置鼠标钩子 # hm.UnhookMouse()  # 取消鼠标钩子
    r = 0
def pressASD(a): #按下脚本 执行 快捷键
    global ls,writeBtn,r
    r = 0
    play()
    print(f'使用脚本{a}')  # 普通鱼
    ta = threading.Thread(target=work, args=(a,))
    ta.start()
def work(a): # 执行脚本内容
    global ls,writeBtn,r
    btns = rd(a)
    for i in btns:
        if i[0] == 'd' and r == 0:
            d(i[1])
        elif i[0] == 'u' and r == 0:
            u(i[1])
        elif r == 1:
            break
    else:
        print(f'脚本{a}完毕')
        play()

#监听键盘事件
def OnKeyboardEvent(event):
    global ls,writeBtn,r
    if w.GetWindowText(w.GetForegroundWindow()) == '猌狶竤獿肚':
        if event.Ascii == 113: #q
            pressQWE('a')
        elif event.Ascii == 119: #w
            pressQWE('s')
        elif event.Ascii == 101: #e
            pressQWE('d')
        elif event.Ascii == 32:#space
            pressSpace()
        elif event.Ascii == 97: #a
            pressASD('a')
        elif event.Ascii == 115: #s
            pressASD('s')
        elif event.Ascii == 100: #d
            pressASD('d')
        return True
    return True

def main(): #主函数
    global t0,t1,ls,writeBtn,cf,hm,r
    try:
        print('主程序已启动,请切换至游戏界面')
        t0 = 0  # 按键时长记录用
        t1 = 1  # 按键时长记录用
        ls = []  # 临时存储录制的脚本
        writeBtn = '0'  # 存储快捷键
        cf = configparser.ConfigParser()  # 读配置文件 实例化
        hm = PyHook3.HookManager()  # 键鼠监控 实例化
        r = 0  # 录制 / 执行 脚本的停止状态

        hm.KeyDown = OnKeyboardEvent  # 将OnKeyboardEvent函数绑定到KeyDown事件上
        hm.HookKeyboard()  # 设置键盘钩子
        pythoncom.PumpMessages()  # 阻塞循环
    except:
        print(f'异常退出:{traceback.format_exc()}')
        main()

if __name__ == '__main__':
    print(use)
    while 1:
        if not os.path.exists('钓鱼脚本录制.ini'):
            with open('钓鱼脚本录制.ini', 'w')as c:
                c.write('[btn]')
                c.close()
        run = input('请选择功能:\n1. 启动程序\n2. 关于本软件\n3. 联系作者\n')
        if run == '1':
            main() #执行
        elif run=='2':
            print(about)
        elif run=='3':
            print(QR)
